Passed
Push — develop ( 85cdd9...7e7842 )
by Lorenzo
02:18 queued 01:15
created

TestRouter1   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 6
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 1
eloc 5
dl 0
loc 6
rs 10
c 0
b 0
f 0

1 Function

Rating   Name   Duplication   Size   Complexity  
A test 0 3 1
1
import { flushPromises } from '@test/utils/testUtils';
2
import * as http from 'http';
3
import { NextFunction, Request, Response } from 'express';
4
import request from 'supertest';
5
import ExpressBeans from '@/core/ExpressBeans';
6
import { Logger, Route, RouterBean } from '@/main';
7
import { logger } from '@/core';
8
9
jest.mock('pino-http', () => ({
10
  pinoHttp: ({
11
    logger: loggerInstance,
12
    customSuccessMessage,
13
    customErrorMessage,
14
  }: {
15
    logger: Logger,
16
    customSuccessMessage: (req: Request, res: Response) => string,
17
    customErrorMessage: (req: Request, res: Response) => string
18
  }) => (req: Request, res: Response, next: NextFunction) => {
19
    if (res.err) {
20
      loggerInstance.error(customErrorMessage(req, res));
21
    } else {
22
      loggerInstance.info(customSuccessMessage(req, res));
23
    }
24
    next();
25
  },
26
  startTime: jest.requireActual('pino-http').startTime,
27
}));
28
jest.mock('@/core', () => ({
29
  registeredBeans: new Map(),
30
  registeredMethods: new Map(),
31
  logger: {
32
    info: jest.fn(),
33
    debug: jest.fn(),
34
    error: jest.fn(),
35
  },
36
}));
37
38
describe('ExpressBeans integration tests', () => {
39
  let server: http.Server;
40
  let server2: http.Server;
41
  let application: ExpressBeans;
42
  let application2: ExpressBeans;
43
  beforeEach(() => {
44
    jest.resetModules();
45
    jest.clearAllMocks();
46
  });
47
48
  afterEach(() => {
49
    server.close();
50
    if (server2) {
51
      server2.close();
52
    }
53
  });
54
55
  test('start of application', async () => {
56
    // GIVEN
57
    @RouterBean('/test')
58
    class TestRouter {
59
      @Route('GET', '/42')
60
      test(_req: Request, res: Response) {
61
        res.send('42 is the answer');
62
      }
63
    }
64
    application = new ExpressBeans({ listen: false, routerBeans: [TestRouter] });
65
    await flushPromises();
66
    server = application.listen(3001);
67
    await flushPromises();
68
69
    // WHEN
70
    const { text } = await request(server).get('/test/42').expect(200);
71
72
    // THEN
73
    expect(text).toBe('42 is the answer');
74
  });
75
76
  test('creation of a new application', async () => {
77
    // WHEN
78
    application = new ExpressBeans({ listen: false });
79
    server = application.getApp().listen(3000);
80
    await flushPromises();
81
82
    // THEN
83
    expect(application instanceof ExpressBeans).toBe(true);
84
  });
85
86
  test('start multiple applications', async () => {
87
    // GIVEN
88
    @RouterBean('/test1')
89
    class TestRouter1 {
90
      @Route('GET', '/42')
91
      test(_req: Request, res: Response) {
92
        res.send('42 is the answer');
93
      }
94
    }
95
    @RouterBean('/test2')
96
    class TestRouter2 {
97
      @Route('GET', '/thanks')
98
      test(_req: Request, res: Response) {
99
        res.send('for all the fish');
100
      }
101
    }
102
    application = new ExpressBeans({ listen: false, routerBeans: [TestRouter1] });
103
    application2 = new ExpressBeans({ listen: false, routerBeans: [TestRouter2] });
104
    await flushPromises();
105
    server = application.listen(4001);
106
    server2 = application2.listen(4002);
107
    await flushPromises();
108
109
    // WHEN
110
    const { text } = await request(server).get('/test1/42').expect(200);
111
    const { text: text2 } = await request(server2).get('/test2/thanks').expect(200);
112
    await request(server).get('/test2/thanks').expect(404);
113
    await request(server2).get('/test1/42').expect(404);
114
115
    // THEN
116
    expect(text).toBe('42 is the answer');
117
    expect(text2).toBe('for all the fish');
118
  });
119
120
  test('logs incoming requests', async () => {
121
    // GIVEN
122
    const loggerMock = jest.mocked(logger);
123
    @RouterBean('/test')
124
    class TestRouter {
125
      @Route('GET', '/42')
126
      test(_req: Request, res: Response) {
127
        res.send('42 is the answer');
128
      }
129
    }
130
    application = new ExpressBeans({ listen: false, routerBeans: [TestRouter] });
131
    await flushPromises();
132
    server = application.listen(3001);
133
    await flushPromises();
134
135
    // WHEN
136
    await (await request(server).get('/test/42').expect(200));
137
138
    // THEN
139
    expect(loggerMock.info).toHaveBeenCalledWith('::ffff:127.0.0.1 - "GET /test/42 HTTP/1.1" 200 - NaNms');
140
  });
141
142
  test('logs incoming requests using ip from header (proxy)', async () => {
143
    // GIVEN
144
    const loggerMock = jest.mocked(logger);
145
    @RouterBean('/test')
146
    class TestRouter {
147
      @Route('GET', '/42')
148
      test(_req: Request, res: Response) {
149
        res.send('42 is the answer');
150
      }
151
    }
152
    application = new ExpressBeans({ listen: false, routerBeans: [TestRouter] });
153
    await flushPromises();
154
    server = application.listen(3001);
155
    await flushPromises();
156
157
    // WHEN
158
    await (await request(server).get('/test/42').set({ 'x-forwarded-for': '193.234.61.32' }).expect(200));
159
160
    // THEN
161
    expect(loggerMock.info).toHaveBeenCalledWith('193.234.61.32 - "GET /test/42 HTTP/1.1" 200 - NaNms');
162
  });
163
});
164